package com.shift.sdk.dialog;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.DialogInterface.OnClickListener;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.CheckBox;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;

import com.shift.sdk.AnalyzeOption;
import com.shift.sdk.MovieActivity;
import com.shift.sdk.MoviePreview;
import com.shift.sdk.PictureActivity;
import com.shift.sdk.R;

/**
 * 設定ダイアログ.
 *
 * @author SHIFT
 */
public class OptionDialog extends AlertDialog.Builder implements OnCancelListener {

    /**
     * コンテキスト.
     */
    private Context context;

    /**
     * 解析オプション.
     */
    private AnalyzeOption option;

    /**
     * チェックボックス(基準点描画)
     */
    private CheckBox checkBasePoint;

    /**
     * シークバー(解析レベル)
     */
    private SeekBar seek_analyze_lebel;

    /**
     * シークバー(最大解析数)
     */
    private SeekBar seek_maxcount;

    /**
     * シークバー(線の太さ)
     */
    private SeekBar seek_thickness;

    /**
     * プレビュー.
     */
    private MoviePreview moviePreview;

    /**
     * コンストラクタ.
     *
     * @param context
     *            コンテキスト
     */
    public OptionDialog(Context context) {
        super(context);
        this.context = context;

        if (context instanceof MovieActivity) {
            this.option = MovieActivity.option;
        } else {
            this.option = PictureActivity.option;
        }
        createView();
        setOnCancelListener(this);
    }

    /**
     * ビュー生成.
     */
    private void createView() {

        // ディスプレイサイズよりダイアログサイズを求める
        DisplayMetrics metrics = context.getResources().getDisplayMetrics();
        int dialogWidth = (int) (metrics.widthPixels * 0.8);

        // レイアウトXMLよりViewを生成
        LayoutInflater inflater = LayoutInflater.from(context);
        final View v = inflater.inflate(R.layout.set_option, null);

        // タイトル
        TextView title = (TextView) v.findViewById(R.id.text_title);
        title.setWidth(dialogWidth);

        // 基準点描画
        checkBasePoint = (CheckBox) v.findViewById(R.id.checkBasePoint);

        // 解析レベル
        TextView text_analyze_lebel_value = (TextView) v
                .findViewById(R.id.text_analyze_lebel_value);
        seek_analyze_lebel = (SeekBar) v.findViewById(R.id.seek_analyze_lebel);
        text_analyze_lebel_value.setText(String.valueOf(option.getAnalizeLevel()));
        seek_analyze_lebel.setOnSeekBarChangeListener(new OnOptionSheekBarChangeListener(
                text_analyze_lebel_value));
        seek_analyze_lebel.setProgress(option.getAnalizeLevel() - 1);

        // 最大解析コード数
        TextView text_maxcount_value = (TextView) v.findViewById(R.id.text_maxcount_value);
        seek_maxcount = (SeekBar) v.findViewById(R.id.seek_maxcount);
        text_maxcount_value.setText(String.valueOf(option.getMaxCodeCount()));
        seek_maxcount.setOnSeekBarChangeListener(new OnOptionSheekBarChangeListener(
                text_maxcount_value));
        seek_maxcount.setProgress(option.getMaxCodeCount() - 1);

        // コード線太さ
        TextView text_thickness_value = (TextView) v.findViewById(R.id.text_thickness_value);
        seek_thickness = (SeekBar) v.findViewById(R.id.seek_thickness);
        text_thickness_value.setText(String.valueOf(option.getThickness()));
        seek_thickness.setOnSeekBarChangeListener(new OnOptionSheekBarChangeListener(
                text_thickness_value));
        seek_thickness.setProgress(option.getThickness() - 1);

        setView(v);
        setPositiveButton("決定", new OnClickOKListener());

        if (context instanceof MovieActivity) {
            moviePreview = ((MovieActivity) context).getMoviePreview();
        }
    }

    /**
     * キャンセル時のリスナー.
     */
    @Override
    public void onCancel(DialogInterface arg0) {
        if (context instanceof MovieActivity) {
            moviePreview.startPreview();
        }
    }

    /**
     * SheekBar変更時のリスナー.
     */
    private class OnOptionSheekBarChangeListener implements OnSeekBarChangeListener {

        /**
         * 変更されたビュー.
         */
        private TextView view;

        /**
         * コンストラクタ.
         *
         * @param view
         *            変更されたビュー
         */
        public OnOptionSheekBarChangeListener(TextView view) {
            super();
            this.view = view;
        }

        /**
         * バーの値が変更された時の処理.
         */
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress,
                boolean fromUser) {
            view.setText(String.valueOf(progress + 1));
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            // nop
        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            // nop
        }
    }

    /***
     * OKボタン押下時の処理
     */
    private class OnClickOKListener implements OnClickListener {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            option.setAnalizeLevel(seek_analyze_lebel.getProgress() + 1);
            option.setMaxCodeCount(seek_maxcount.getProgress() + 1);
            option.setThickness(seek_thickness.getProgress() + 1);
            option.setDrawBasePoint(checkBasePoint.isChecked());

            // Movieモードの場合
            if (context instanceof MovieActivity) {
                moviePreview.startPreview();
            }
        }
    }
}
